package cn.zk.simple.server;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeUnit;

/**
 * Handler
 * 该handler处理客户端发送的信息（打印出来），并发送信息（你好客户端！）给客户端
 */
public class NettyServerHandler extends ChannelInboundHandlerAdapter {
    /**
     * 读取信息
     * @param ctx 上下文对象，包含channel,pipeline,地址。。。
     * @param msg 信息 需要用ByteBuf转换
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        // 一、简单操作
        // 获取客户端的消息
        //ByteBuf buf = (ByteBuf) msg;
        //String message = buf.toString(StandardCharsets.UTF_8);
        //SocketAddress socketAddress = ctx.channel().remoteAddress();
        //System.out.println("来自客户端:"+socketAddress+"的消息:"+message);
        //System.out.println("==>执行线程为:"+Thread.currentThread().getName());

        // 二、对于耗时长的操作可以加入taskQueue或scheduleQueue中异步执行
        // 加入到taskQueue执行任务
        //System.out.println("有新消息==>当前时间:"+System.currentTimeMillis());
        //// 异步执行
        //ctx.channel().eventLoop().execute(new Runnable() {
        //    @Override
        //    public void run() {
        //        ByteBuf buf = (ByteBuf) msg;
        //        String message = buf.toString(StandardCharsets.UTF_8);
        //        try {
        //            Thread.sleep(10 * 1000);// 休眠10s
        //        } catch (InterruptedException e) {
        //            e.printStackTrace();
        //        }
        //        System.out.println("=>来自客户端:"+ctx.channel().remoteAddress()+"的消息:"+message);
        //    }
        //});
        //System.out.println("已交给taskQueue异步处理==>当前时间:"+System.currentTimeMillis());

        // 加入到scheduleQueue 执行定时任务
        System.out.println("有新消息==>当前时间:"+System.currentTimeMillis());
        // 异步执行
        ctx.channel().eventLoop().schedule(new Runnable() {
            @Override
            public void run() {
                ByteBuf buf = (ByteBuf) msg;
                String message = buf.toString(StandardCharsets.UTF_8);
                System.out.println("=>来自客户端:"+ctx.channel().remoteAddress()+"的消息:"+message);
            }
        },5, TimeUnit.SECONDS);// 5s后执行
        System.out.println("已交给scheduleQueue异步处理==>当前时间:"+System.currentTimeMillis());

    }

    /**
     * 接收完消息之后的处理
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        // 给客户端回复消息 write：写+Flush刷新缓冲区
        String msg = "你好客户端！"+System.currentTimeMillis();
        ctx.writeAndFlush(Unpooled.copiedBuffer(msg,StandardCharsets.UTF_8));
    }

    /**
     * 发生异常后的处理
     * @param ctx
     * @param cause
     * @throws Exception
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        // 关闭连接
        ctx.close();
    }
}
